package example

import (
	"bytes"
	"fmt"
	"io"
	"strings"
)

// 字节和字符串读写

func Case4() {

	fmt.Println("🎯字节和字符串读写")

	// 1. bytes.Buffer - 内存缓冲区
	var buf bytes.Buffer

	// 写入数据
	buf.WriteString("Hello, ")
	buf.WriteString("World!\n")
	buf.WriteByte('A')
	buf.WriteRune('中')
	buf.Write([]byte("文字\n"))

	fmt.Printf("缓冲区内容:\n%s", buf.String())
	fmt.Printf("缓冲区长度: %d\n", buf.Len())

	// 从缓冲区读取
	readBuf := make([]byte, 10)
	n, _ := buf.Read(readBuf)
	fmt.Printf("读取 %d 字节: %q\n", n, string(readBuf[:n]))

	// 2. strings.Reader - 字符串读取器
	str := "这是一个测试字符串，用于演示strings.Reader"
	reader := strings.NewReader(str)

	fmt.Printf("\n字符串长度: %d\n", reader.Len())

	// 读取前10个字节
	first10 := make([]byte, 10)
	reader.Read(first10)
	fmt.Printf("前10字节: %s\n", string(first10))

	// 查看剩余长度
	fmt.Printf("剩余长度: %d\n", reader.Len())

	// 3. 使用io.Copy
	fmt.Println("\n=== 使用io.Copy ===")
	source := strings.NewReader("这是源数据")
	destination := &bytes.Buffer{}

	bytesCopied, err := io.Copy(destination, source)
	if err != nil {
		fmt.Printf("复制错误: %v\n", err)
		return
	}

	fmt.Printf("复制了 %d 字节\n", bytesCopied)
	fmt.Printf("目标内容: %s\n", destination.String())

	// 4. io.CopyBuffer - 指定缓冲区大小
	source2 := strings.NewReader("另一段源数据")
	dest2 := &bytes.Buffer{}
	buffer := make([]byte, 8) // 8字节缓冲区

	bytesCopied2, err := io.CopyBuffer(dest2, source2, buffer)
	if err != nil {
		fmt.Printf("复制错误: %v\n", err)
		return
	}

	fmt.Printf("使用CopyBuffer复制了 %d 字节\n", bytesCopied2)
	fmt.Printf("目标内容: %s\n", dest2.String())
}
